package com.main.antenne;

import java.util.ArrayList;

import ErgebnisFilterung.DatenFilter;
import ErgebnisFilterung.Liga;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.DataSetObserver;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class LigaActivity extends Activity {

	private static ArrayList<Liga> ligen;
	private DownloadTask task;
	private ListView list;
	private ProgressDialog dialog;
	private AlertDialog alert;
	private boolean keineVerbindung = false;

	@SuppressWarnings("deprecation")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.liga_layout);

		list = (ListView) findViewById(R.id.Liste);

		// Dialog erstellen
		dialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_DARK);
		dialog.setMessage("Laden...");
		dialog.setCancelable(false);

		task = (DownloadTask) getLastNonConfigurationInstance();

		// Wenn noch kein Task gestartet ist, starte neuen Download-Task; sonst
		// ersetze Activity des laufenden Tasks
		if (task == null) {
			task = new DownloadTask(this);
			task.execute();
		} else {
			task.setActivity(this);
			updateAdapter();
		}

		list.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int id,
					long arg3) {
				prüfeVerbindung();
				if (!keineVerbindung) {
					Liga liga = ligen.get(id);
					startActivity(new AntenneIntent(getApplicationContext(),
							ErgebnisActivity.class,
							AntenneIntent.getSportart(), liga.getAbkuerzung(),
							liga.getSaison()));
					overridePendingTransition(R.anim.openactivity,
							R.anim.activitydisappear);
				}
			}
		});

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MainActivity.addLiveStreamMenuItem(menu, this);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		MainActivity.updateLiveStreamMenuItemText(menu.getItem(0));
		return super.onPrepareOptionsMenu(menu);
	}

	@Override
	protected void onStop() {
		dismissDialog();
		// Bevor die Activity gestoppt wird, z.B. bei einer Bildschirmdrehung,
		// wird der Ladedialog oder der Fehlermeldungsdialog beendet, um eine
		// Exception zu vermeiden
		if (dialog != null)
			dismissDialog();
		if (alert != null && alert.isShowing())
			alert.dismiss();
		super.onStop();
	}

	/*
	 * anzeigen des Ladedialogs
	 */
	void showDialog() {
		dialog.show();
	}

	/*
	 * beenden des Ladedialogs
	 */
	void dismissDialog() {
		dialog.dismiss();
	}

	/*
	 * der aktuelle Adapter wird auf den aktualisierten Adapder aus dem
	 * Download-Task gesetzt
	 */
	void updateAdapter() {
		list.setAdapter(task.adapter);
	}

	@Override
	@Deprecated
	public Object onRetainNonConfigurationInstance() {
		task.activityNull();
		return task;
	}

	public class DownloadTask extends AsyncTask<Void, Void, Void> {

		ListAdapter adapter;
		LigaActivity activity;

		public DownloadTask(LigaActivity activity) {
			this.activity = activity;
		}

		@Override
		public void onPreExecute() {
			activity.showDialog();
		}

		@Override
		public Void doInBackground(Void... unused) {
			ligen = new ArrayList<Liga>();
			DatenFilter filter = new DatenFilter(activity, "ligen");
			filter.start();

			try {
				filter.getZuAktualisieren().acquire();
			} catch (InterruptedException e) {
			}
			ligen = filter.getLigenListe();
			return null;
		}

		@Override
		public void onPostExecute(Void unused) {
			adapter = new ListAdapter() {

				@Override
				public void unregisterDataSetObserver(DataSetObserver observer) {
					// TODO Auto-generated method stub

				}

				@Override
				public void registerDataSetObserver(DataSetObserver observer) {
					// TODO Auto-generated method stub

				}

				@Override
				public boolean isEmpty() {
					// TODO Auto-generated method stub
					return false;
				}

				@Override
				public boolean hasStableIds() {
					// TODO Auto-generated method stub
					return false;
				}

				@Override
				public int getViewTypeCount() {
					return 1;
				}

				@Override
				public View getView(int position, View convertView,
						ViewGroup parent) {
					LinearLayout row = new LinearLayout(activity);
					row.setOrientation(LinearLayout.VERTICAL);

					TextView text = new TextView(row.getContext());
					text.setPadding(15, 0, 0, 0);
					text.setMinimumHeight(60);
					text.setText(ligen.get(position).getName());
					text.setTextAppearance(getApplicationContext(),
							R.style.Rote_Schrift_Fett);
					text.setGravity(Gravity.CENTER_VERTICAL);

					TextView saison = new TextView(row.getContext());
					saison.setMinimumHeight(40);
					saison.setPadding(15, 0, 0, 0);
					int sai = Integer.parseInt(ligen.get(position).getSaison());
					saison.setText("Saison " + Integer.toString(sai) + "/"
							+ Integer.toString(sai + 1));
					saison.setTextAppearance(getApplicationContext(),
							R.style.Rote_Schrift_Kursiv);
					saison.setGravity(Gravity.CENTER_VERTICAL);

					row.addView(text);
					row.addView(saison);
					if (position % 2 == 0)
						row.setBackgroundResource(R.drawable.dunkelgelb_listitem_background);
					else
						row.setBackgroundResource(R.drawable.hellgelb_listitem_background);

					row.setMinimumHeight(100);

					return row;
				}

				@Override
				public int getItemViewType(int position) {
					return 0;
				}

				@Override
				public long getItemId(int position) {
					return position;
				}

				@Override
				public Object getItem(int position) {
					return ligen.get(position);
				}

				@Override
				public int getCount() {
					return ligen.size();
				}

				@Override
				public boolean isEnabled(int position) {
					return true;
				}

				@Override
				public boolean areAllItemsEnabled() {
					return true;
				}
			};
			activity.updateAdapter();
			activity.dismissDialog();
		}

		void activityNull() {
			activity = null;
		}

		void setActivity(LigaActivity activity) {
			this.activity = activity;
		}

	}

	@Override
	public void onBackPressed() {
		finish();
		overridePendingTransition(R.anim.reopenactivity,
				R.anim.activitydisappear);
	}

	/*
	 * Pr�ft ob eine Verbindung vorhanden ist falls nicht wird keineVerbindung
	 * auf true gesetzt und eine Fehlermeldung erstellt sonst wird
	 * keineVerbindung auf false gesetzt
	 */
	void prüfeVerbindung() {
		if (!verbindungVorhanden()) {
			keineVerbindung = true;
			macheVerbindungsfehlerDialog();
		} else
			keineVerbindung = false;
	}

	/*
	 * Pr�ft, ob eine Internetverbindung vorhanden ist falls nicht wird false
	 * zur�ckgeliefert falls schon wird true zur�ckgeliefert
	 */
	boolean verbindungVorhanden() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info == null) {
			return false;
		} else
			return true;
	}

	/*
	 * Ein Dialog wird erstellt, der anzeigt, dass keine Internetverbindung
	 * vorhanden ist mit dem OK-Button wird der Dialog beendet
	 */
	void macheVerbindungsfehlerDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Keine Internetverbindung");
		builder.setMessage("Bitte Internetverbindung aktivieren!");
		builder.setCancelable(false);
		builder.setNegativeButton("Ok", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				alert.dismiss();
			}
		});
		alert = builder.create();
		alert.show();
	}

}
